{
 "cells": [
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# Benchmark \n",
    "---\n",
    "\n",
    "This notebook compares the decoder performance between Viterbi Decoder and Neural Decoder [1] on Convolution Codes over AWGN Channel.\n",
    "\n",
    "Reference:\n",
    "* [1] Kim, Hyeji, et al. \"Communication Algorithms via Deep Learning.\" ICLR (2018)\n",
    "\n",
    "\n",
    "### TODOs:\n",
    "---\n",
    "\n",
    "* [x] Benchmark Viterbi Decoder \n",
    "* [x] Benchmark Neural Decoder\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 1,
   "metadata": {},
   "outputs": [],
   "source": [
    "import os \n",
    "import pickle\n",
    "import numpy as np\n",
    "import commpy as cp\n",
    "import tensorflow as tf\n",
    "import multiprocessing as mp\n",
    "\n",
    "from deepcom.metrics import BER, BLER         # metrics to benchmark Neural Decoder Model\n",
    "from deepcom.utils import corrupt_signal      # simulate a AWGN Channel\n",
    "from deepcom.dataset import data_genenerator  # data loader for Tensorflow\n",
    "from deepcom.NeuralDecoder import NRSCDecoder # Neural Decoder Model\n",
    "\n",
    "BATCH_SIZE = 500       # depends on size of GPU\n",
    "BLOCK_LEN = 100        # length of a message bits\n",
    "CONSTRAINT_LEN = 3     # num of shifts in Conv. Encoder\n",
    "TRACE_BACK_DEPTH = 15  # (?) a parameter Viterbi Encoder"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# Load Dataset\n",
    "* Dataset should be generated using script `generate_synthetic_dataset.py`\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Number of testing sequences 10000\n"
     ]
    }
   ],
   "source": [
    "DATASET_PATH = 'rnn_bl100_snr0.0.dataset'\n",
    "with open(DATASET_PATH, 'rb') as f:\n",
    "    _, _, X_test, Y_test = pickle.load(f)  # ignore training data\n",
    "print('Number of testing sequences {}'.format(len(X_test)))"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# Load pre-trained Neural Decoder"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "./logs/BiGRU-2-400::dropout-0.7::epochs-50/BiGRU.hdf5\n",
      "Pre-trained model is loaded.\n"
     ]
    }
   ],
   "source": [
    "experiment_log = './logs/BiGRU-2-400::dropout-0.7::epochs-50'\n",
    "try:\n",
    "    model_path = os.path.join(experiment_log, 'BiGRU.hdf5')\n",
    "    print(model_path)\n",
    "    model = tf.keras.models.load_model(model_path, custom_objects={'BER': BER, 'BLER': BLER})\n",
    "    model.compile(optimizer='adam', loss='binary_crossentropy')\n",
    "    print('Pre-trained model is loaded.')\n",
    "except Exception as e:\n",
    "    print(e)\n",
    "    raise ValueError('Pre-trained model is not found.')"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# Setup Benchmarks"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 4,
   "metadata": {},
   "outputs": [],
   "source": [
    "from commpy.channelcoding import Trellis\n",
    "\n",
    "#  Generator Matrix (octal representation)\n",
    "G = np.array([[0o7, 0o5]]) \n",
    "M = np.array([CONSTRAINT_LEN - 1])  # Number of delay elements in the convolutional encoder\n",
    "trellis = Trellis(M, G, feedback=0o7, code_type='rsc')\n",
    "\n",
    "# #################################################################\n",
    "# For every SNR_db, we generates new noisy signals\n",
    "# for fair comparision.\n",
    "# #################################################################\n",
    "def generate_noisy_input(message_bits, trellis, sigma):\n",
    "    # Encode message bit\n",
    "    coded_bits = cp.channelcoding.conv_encode(message_bits, trellis)\n",
    "    # Corrupt message on BAWGN Channel\n",
    "    coded_bits = corrupt_signal(coded_bits, noise_type='awgn', sigma=sigma)\n",
    "    return coded_bits, message_bits"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 5,
   "metadata": {},
   "outputs": [],
   "source": [
    "def benchmark_neural_decoder(noisy_inputs, labels):\n",
    "    Y = np.reshape(labels, (-1, BLOCK_LEN, 1))\n",
    "    X = np.reshape(np.array(noisy_inputs)[:, :2*BLOCK_LEN], (-1, BLOCK_LEN, 2))\n",
    "    test_set = data_genenerator(X, Y, BATCH_SIZE, shuffle=False)\n",
    "    decoded_bits = model.predict(\n",
    "        test_set.make_one_shot_iterator(), \n",
    "        steps=len(Y) // BATCH_SIZE)\n",
    "    original_bits = np.reshape(Y, (-1, BLOCK_LEN)).astype(int)\n",
    "    decoded_bits =  np.reshape(np.round(decoded_bits), (-1, BLOCK_LEN)).astype(int)\n",
    "    hamming_dist = np.not_equal(original_bits, decoded_bits)\n",
    "    return np.sum(hamming_dist, axis=1)\n",
    "\n",
    "def benchmark_viterbi(message_bits, noisy_bits, sigma):\n",
    "    # make fair comparison between (100, 204) convolutional code and RNN decoder\n",
    "    # Reference: Author's code\n",
    "    noisy_bits[-2*int(M):] = 0\n",
    "    # Viterbi Decoder on Conv. Code\n",
    "    decoded_bits = cp.channelcoding.viterbi_decode(\n",
    "        coded_bits=noisy_bits.astype(float), \n",
    "        trellis=trellis,\n",
    "        tb_depth=TRACE_BACK_DEPTH,\n",
    "        decoding_type='unquantized')\n",
    "    # Number of bit errors (hamming distance)\n",
    "    hamming_dist = cp.utilities.hamming_dist(\n",
    "        message_bits.astype(int),\n",
    "        decoded_bits[:-int(M)])\n",
    "    return hamming_dist"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 6,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "[SNR]=0.00\n",
      "\tNeural Decoder: [BER]=0.0547118 [BLER]=1.000 \n",
      "\tViterbi Decoder: [BER]=0.0901860 [BLER]=0.952 \n",
      "[SNR]=1.00\n",
      "\tNeural Decoder: [BER]=0.0361873 [BLER]=0.991 \n",
      "\tViterbi Decoder: [BER]=0.0472540 [BLER]=0.780 \n",
      "[SNR]=2.00\n",
      "\tNeural Decoder: [BER]=0.0206078 [BLER]=0.949 \n",
      "\tViterbi Decoder: [BER]=0.0186210 [BLER]=0.455 \n",
      "[SNR]=3.00\n",
      "\tNeural Decoder: [BER]=0.0107461 [BLER]=0.830 \n",
      "\tViterbi Decoder: [BER]=0.0059710 [BLER]=0.203 \n",
      "[SNR]=4.00\n",
      "\tNeural Decoder: [BER]=0.0050701 [BLER]=0.591 \n",
      "\tViterbi Decoder: [BER]=0.0016050 [BLER]=0.059 \n",
      "[SNR]=5.00\n",
      "\tNeural Decoder: [BER]=0.0021059 [BLER]=0.321 \n",
      "\tViterbi Decoder: [BER]=0.0003100 [BLER]=0.015 \n",
      "[SNR]=6.00\n",
      "\tNeural Decoder: [BER]=0.0007270 [BLER]=0.134 \n",
      "\tViterbi Decoder: [BER]=0.0000410 [BLER]=0.003 \n",
      "[SNR]=7.00\n",
      "\tNeural Decoder: [BER]=0.0002721 [BLER]=0.052 \n",
      "\tViterbi Decoder: [BER]=0.0000070 [BLER]=0.001 \n"
     ]
    }
   ],
   "source": [
    "viterbiBERs, viterbiBLERs = [], []\n",
    "neuralBERs, neuralBLERs = [], []\n",
    "\n",
    "pool = mp.Pool(processes=mp.cpu_count())\n",
    "labels = np.reshape(Y_test, (-1, BLOCK_LEN)).astype(int)\n",
    "try: \n",
    "    SNRs  = np.linspace(0, 7.0, 8)\n",
    "    for snr in SNRs:\n",
    "        snr_linear = snr + 10 * np.log10(1./2.)\n",
    "        sigma = np.sqrt(1. / (2. * 10 **(snr_linear / 10.)))\n",
    "        print('[SNR]={:.2f}'.format(snr))\n",
    "        \n",
    "        # Generates new noisy signals\n",
    "        result = pool.starmap(generate_noisy_input,  [(msg_bits, trellis, sigma) for msg_bits in labels])\n",
    "        X, Y =  zip(*result)\n",
    "        \n",
    "        # #################################################################\n",
    "        # BENCHMARK NEURAL DECODER \n",
    "        # #################################################################\n",
    "        hamm_dists = benchmark_neural_decoder(X, Y)\n",
    "        nn_ber = sum(hamm_dists) / np.product(np.shape(X))\n",
    "        nn_bler = np.count_nonzero(hamm_dists) / len(X)\n",
    "\n",
    "        neuralBERs.append(nn_ber)\n",
    "        neuralBLERs.append(nn_bler)            \n",
    "        print('\\tNeural Decoder:  [BER]={:5.7f} [BLER]={:5.3f} '.format(nn_ber, nn_bler)) \n",
    "\n",
    "        # #################################################################\n",
    "        # BENCHMARK VITERBI DECODER \n",
    "        # #################################################################\n",
    "        hamm_dists = pool.starmap(benchmark_viterbi, [(y, x, sigma) for x, y in zip(X, Y)])\n",
    "        # Bit error rate\n",
    "        ber = sum(hamm_dists) / np.product(np.shape(Y))\n",
    "        # Block error rate\n",
    "        bler = np.count_nonzero(hamm_dists) / len(Y)\n",
    "        viterbiBERs.append(ber)\n",
    "        viterbiBLERs.append(bler)\n",
    "        print('\\tViterbi Decoder: [BER]={:5.7f} [BLER]={:5.3f} '.format(ber, bler)) \n",
    "        \n",
    "except Exception as e:\n",
    "    print(e)\n",
    "finally:\n",
    "    pool.close()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 7,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 720x576 with 1 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "import matplotlib.pyplot as plt\n",
    "%matplotlib inline\n",
    "\n",
    "plt.figure(figsize=(10, 8))\n",
    "plt.semilogy(SNRs, viterbiBERs)\n",
    "plt.semilogy(SNRs, neuralBERs)\n",
    "plt.title('Encoding: Conv. Code || Block Length = 100 || Data rate = 1/2', fontsize=14)\n",
    "plt.legend(['Viterbi', 'Neural'], fontsize=16)\n",
    "plt.xlabel('SNR', fontsize=16)\n",
    "plt.xlim(xmin=SNRs[0], xmax=SNRs[-1])  # this line\n",
    "plt.ylabel('BER', fontsize=16)\n",
    "plt.grid(True, which='both')\n",
    "plt.show()"
   ]
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 3",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.6.5"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 2
}
